﻿using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace Black.SurfaceToolkit.Controls
{
    /// <summary>
    /// Represente un conteneur qui peu s'agrandir.
    /// </summary>
    /// <remarks>
    /// <para>Ce contrôle est un conteneur simple controlé par deux facteurs d'agrandissement (<see cref="P:Black.SurfaceToolkit.Controls.GrowingContainer.XExtension" /> et <see cref="P:Black.SurfaceToolkit.Controls.GrowingContainer.XExtension" />).</para>
    /// <para><div class="caption" style="font-weight : bold">GrowingContainer normal</div></para>
    /// <para><img src="../Images/GrowingContainer.Normal.png" /></para>
    /// <para><div class="caption" style="font-weight : bold">GrowingContainer avec un agrandissement de  <c>(0.5, 0.6)</c> et différents alignements</div></para>
    /// <para><table style="width:auto; text-align:center; border-top:1px #d5d5d3 solid; border-right:1px #d5d5d3 solid" align="left" cellpadding="0" cellspacing="0">
    /// <tr>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Haut - Gauche</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.TopLeft.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Haut - Centre</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.TopCenter.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Haut - Droite</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.TopRight.png" /></td>
    /// </tr>
    /// <tr>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Centre - Gauche</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.CenterLeft.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Centre - Centre</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.CenterCenter.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Centre - Droite</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.CenterRight.png" /></td>
    /// </tr>
    /// <tr>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Bas - Gauche</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.BottomLeft.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Bas - Centre</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.BottomCenter.png" /></td>
    /// <td style="border-bottom:1px #d5d5d3 solid;border-left:1px #d5d5d3 solid; background-color:white"><div class="caption" style="margin:5px">Bas - Droite</div><img style="margin:0 40px 5px 40px" src="../Images/GrowingContainer.BottomRight.png" /></td>
    /// </tr>
    /// </table></para>
    /// </remarks>
    [Browsable(true), Description("Conteneur pouvant s'agrandir")]
    public class GrowingContainer : ContentControl
    {
        #region Propriétés de dépendance

        /// <summary>
        /// Identifie la propriété de dépendance <see cref="P:Black.SurfaceToolkit.Controls.GrowingContainer.XExtension" />.
        /// </summary>
        public static readonly DependencyProperty XExtensionProperty = DependencyProperty.Register("XExtension", typeof(double), typeof(GrowingContainer), new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(GrowingContainer.IsValidExtension));
        /// <summary>
        /// Identifie la propriété de dépendance <see cref="P:Black.SurfaceToolkit.Controls.GrowingContainer.YExtension" />.
        /// </summary>
        public static readonly DependencyProperty YExtensionProperty = DependencyProperty.Register("YExtension", typeof(double), typeof(GrowingContainer), new FrameworkPropertyMetadata(1.0, FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(GrowingContainer.IsValidExtension));

        #endregion
        
        #region Accesseurs

        /// <summary>
        /// Obtient ou définit le facteur d'agrandissement selon l'axe X.
        /// </summary>
        [Browsable(true), DefaultValue(1.0), Description("Facteur d'agrandissement selon l'axe X"), Category("GrowingContainer")]
        public double XExtension
        {
            get
            {
                return (double)this.GetValue(GrowingContainer.XExtensionProperty);
            }
            set
            {
                this.SetValue(GrowingContainer.XExtensionProperty, value);
            }
        }

        /// <summary>
        /// Obtient ou définit le facteur d'agrandissement selon l'axe Y.
        /// </summary>
        [Browsable(true), DefaultValue(1.0), Description("Facteur d'agrandissement selon l'axe Y"), Category("GrowingContainer")]
        public double YExtension
        {
            get
            {
                return (double)this.GetValue(GrowingContainer.YExtensionProperty);
            }
            set
            {
                this.SetValue(GrowingContainer.YExtensionProperty, value);
            }
        }

        #endregion

        #region Constructeurs

        /// <summary>
        /// Initialise la classe <see cref="T:Black.SurfaceToolkit.Controls.GrowingContainer" />.
        /// </summary>
        static GrowingContainer()
        {
            FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(GrowingContainer), new FrameworkPropertyMetadata(typeof(GrowingContainer)));
        }

        /// <summary>
        /// Initialise une nouvelle instance de <see cref="T:Black.SurfaceToolkit.Controls.GrowingContainer" />.
        /// </summary>
        public GrowingContainer()
            : base()
        {
        }

        #endregion

        #region Fonctions protégées

        /// <summary>
        /// Mesure l'élément et ses enfants en prévision de leur réorganisation pendant la passe <see cref="M:System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size)" />.
        /// </summary>
        /// <param name="p_oConstraint">Taille limite supérieure à ne pas dépasser.</param>
        /// <returns>Taille désirée de l'élément.</returns>
        protected override Size MeasureOverride(Size p_oConstraint)
        {
            Size oResult = base.MeasureOverride(p_oConstraint);

            oResult.Height *= this.YExtension;
            oResult.Width *= this.XExtension;

            return (oResult);
        }

        #endregion

        #region Fonctions statiques privées

        /// <summary>
        /// Valide le facteur d'agrandissement spécifié.
        /// </summary>
        /// <param name="p_oValue">Valeur à valider.</param>
        /// <returns>Valeur indiquant si <paramref name="p_oValue" /> est valide.</returns>
        private static bool IsValidExtension(object p_oValue)
        {
            double dValue = (double)p_oValue;

            return (!double.IsInfinity(dValue) && !double.IsNaN(dValue));
        }

        #endregion
    }
}
